"""
解析本地文件：BeautifulSoup(open("bs401-基本使用.html", "r", encoding='utf-8'), "lxml")
解析网页文件：BeautifulSoup(response.read().decode("utf-8"), "lxml")
"""
import bs4
from bs4 import BeautifulSoup

# 默认打开的编码格式是GBK，因此打开文件的时候需要指定编码
soup = BeautifulSoup(open("bs401-基本使用.html", "r", encoding='utf-8'), "lxml")

# 1. 根据标签名查找结点----->找到的是第一个符合条件的标签: bs4.element.Tag
print(soup.a)
print(soup.a.name, soup.a.attrs)  # 标签名： a，标签属性值： {'href': 'https://www.baidu.com/index.htm'}

# 2. find()----->找到的是第一个符合条件的标签: bs4.element.Tag
# 注意class是python内置的关键字，使用时避免冲突用class_代表标签的class属性
print(soup.find('a'))
print(soup.find('a', title='a2'))
print(soup.find('a', class_='baidu'))

# 3. find_all()----->找到的是所有符合条件的标签: list[bs4.element.Tag]
print(soup.findAll('li'))  # 所有<li>标签
print(soup.findAll(['li', 'a']))  # 所有<li>和<a>标签
# limit
print(soup.findAll('li', limit=2))  # 前两个<li>标签

# 4. select()----->找到的是所有符合条件的标签: list[bs4.element.Tag]
print(soup.select('li'))  # 所有<li>标签
# .class 方式找到符合某一类: list[bs4.element.Tag]
print(soup.select('.baidu'))  # 所有 class="baidu"的标签
# #id 方式找到某一个id代表标签: list[bs4.element.Tag]
print(soup.select('#shenzhen'))  # 所有 id="shenzhen"的标签
# 属性选择: list[bs4.element.Tag]
print(soup.select('li[id]'))  # 所有有id的<li>标签
print(soup.select('li[id="beijing"]'))  # 所有id是"beijing "的<li>标签
# 层级选择器：
# 后代选择器 parent child
print(soup.select('ul li'))  # 所有<ul>下的<li>标签（全部后代，儿子，孙子...）
# 子代选择器 parent > child (只看第一下级子标签) 注意空格！！！！！
print(soup.select('body > ul > li[id="beijing"]'))  # 所有<div>下的<ul>下的<li> id是 “beijing”标签
# 混合选择器
print(soup.select('li，a'))  # 所有<li>和<a>标签

# 5. 获得节点信息
# 获取节点内容
obj = soup.select("#lazy")[0]
print(obj.get_text())  # 哈哈啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊啊
# 获取节点的属性
print(obj.name)  # p
print(obj.attrs)  # {'id': 'lazy'}----->将属性值作为字典返回
print(obj.attrs['id'])  # lazy
